package controlador;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;

import modelo.InsertIntoH2;
import vista.Mensaje;
import estructural.Artista;
import estructural.Audio;
import estructural.Cancion;
import estructural.Formato;
import estructural.Genero;
import estructural.Lenguaje;
import estructural.Video;

public class Lector {
	private static File archivo;
	private static BufferedReader flujo;
	private static String strLinea = "";


	public Lector() {

	}

	public static void leerArchivo(ArrayList<String> rutaArchivosTxt) {
		
		for (String ruta : rutaArchivosTxt) {
			archivo = new File(ruta);

			Genero gen = new Genero("");
			Lenguaje len = new Lenguaje("");
			Formato forAud = new Formato("");
			Audio aud = new Audio("", "", forAud);
			Formato forVid = new Formato("");
			Video vid = new Video("", "", forVid);
			Cancion can = new Cancion("", gen, len, vid, aud);
			Artista art = new Artista("", can);

			int numMaxTags = 0;

			try {
				flujo = new BufferedReader(new FileReader(archivo));

				while (!(strLinea = flujo.readLine().trim()).isEmpty()) {
					StringTokenizer tDosPuntos = new StringTokenizer(strLinea,
							":");
					numMaxTags++;

					if (strLinea.startsWith("#TITLE:")) {
						tDosPuntos.nextToken();
						if (tDosPuntos.hasMoreTokens()) {
							can.setTitCan(tDosPuntos.nextToken());
						}
					} else if (strLinea.startsWith("#ARTIST:")) {
						tDosPuntos.nextToken();
						if (tDosPuntos.hasMoreTokens()) {
							art.setNomArt(tDosPuntos.nextToken());
						}

					} else if (strLinea.startsWith("#LANGUAGE")) {
						tDosPuntos.nextToken();
						if (tDosPuntos.hasMoreTokens()) {
							len.setTipLeng(tDosPuntos.nextToken());
						}
					} else if (strLinea.startsWith("#GENRE:")) {
						tDosPuntos.nextToken();
						if (tDosPuntos.hasMoreTokens()) {
							gen.setNomGen(tDosPuntos.nextToken());
						}
					} else if (strLinea.startsWith("#MP3:")) {
						tDosPuntos.nextToken();
						if (tDosPuntos.hasMoreTokens()) {
							aud.setTitAud(tDosPuntos.nextToken());
							aud.setPathAud(archivo.getParent() + "\\"
									+ aud.getTitAud());
							StringTokenizer tForAud = new StringTokenizer(
									aud.getTitAud(), ".");
							while (tForAud.hasMoreTokens()) {
								forAud.setTipoFor(tForAud.nextToken());
								aud.setFormato(forAud);
							}
						}
					} else if (strLinea.startsWith("#VIDEO:")) {
						tDosPuntos.nextToken();
						if (tDosPuntos.hasMoreTokens()) {
							vid.setTitVid(tDosPuntos.nextToken());
							vid.setPathVid(archivo.getParent() + "\\"
									+ vid.getTitVid());
							StringTokenizer tForVid = new StringTokenizer(
									vid.getTitVid(), ".");
							while (tForVid.hasMoreTokens()) {
								forVid.setTipoFor(tForVid.nextToken());
								vid.setFormato(forVid);
							}
						}
					}

					if (numMaxTags == 16) {
						break;
					}

				}

				can.setAudio(aud);
				can.setGenero(gen);
				can.setLenguaje(len);
				can.setVideo(vid);
				art.setCancion(can);
				
				if(!art.getNomArt().isEmpty()){
					Artista.artList.add(art);
				}
				

			} catch (NullPointerException e) {
				new Mensaje("Se ha producido una excepcion: " + e
						+ " El archivo \"" + archivo.getName()
						+ "\" se encuentra corrupto", Mensaje.error);
				e.printStackTrace();
			} catch (FileNotFoundException e) {
				new Mensaje("Se ha producido una excepcion: " + e,
						Mensaje.error);
				e.printStackTrace();
			} catch (IOException e) {
				new Mensaje("Se ha producido una excepcion: " + e,
						Mensaje.error);
				e.printStackTrace();
			} finally {
				try {
					flujo.close();
				} catch (IOException e) {
					new Mensaje("Se ha producido una excepcion: " + e,
							Mensaje.error);
					e.printStackTrace();
				}
			}

		}
		printArtList(Artista.artList);
		insertarEnBD(Artista.artList);
	}
	
	public static void insertarEnBD(ArrayList<Artista> artL){
		InsertIntoH2 insert =  new InsertIntoH2();
		insert.insert(artL);
	}
	
	public static void printArtList(ArrayList<Artista> artL){
		
		if(!artL.isEmpty()){
			for(Artista art : artL){
				System.out.printf("\nArtista: \t%s" + "\nTitulo: \t%s"
						+ "\nLenguaje: \t%s" + "\nGenero: \t%s"
						+ "\nVideo: \t\t%s" + "\nFormatoVid: \t%s"
						+ "\nPathVid: \t%s" + "\nAudio: \t\t%s"
						+ "\nFormatoAud: \t%s" + "\nPathAud: \t%s\n",
						art.getNomArt(), art.getCancion().getTitCan(), 
						art.getCancion().getLenguaje().getTipLeng(), 
						art.getCancion().getGenero().getNomGen(), 
						art.getCancion().getVideo().getTitVid(), 
						art.getCancion().getVideo().getFormato().getTipoFor(), 
						art.getCancion().getVideo().getPathVid(), 
						art.getCancion().getAudio().getTitAud(), 
						art.getCancion().getAudio().getFormato().getTipoFor(), 
						art.getCancion().getAudio().getPathAud());
			}
		}else{
			System.out.println("artList se encuentra vacio");
		}	
	}

}
